package cn.com.jinhao.hotline.commons.vo.business;

import cn.com.jinhao.hotline.commons.vo.BaseRequestVO;
import cn.com.jinhao.hotline.commons.vo.business.record.TapeRequest;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.Valid;
import javax.validation.constraints.*;
import java.math.BigDecimal;
import java.util.List;

/**
 * 记录事件请求参数
 * @author ShaneWei
 */
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel(value = "RecordInfoRequestVO", description = "记录事件请求参数")
public class RecordInfoRequestVO extends BaseRequestVO {

    public interface Create {}

    public interface Update {}

    /**
     * 事件编码
     */
    @ApiModelProperty(value = "事件编码")
    @NotBlank(message = "事件编码(code)不能为空", groups = {Update.class})
    @Pattern(regexp = "^[0-9]*$", message = "事件编码必须为数字")
    protected String code;

    /**
     * 申诉时间
     */
    @ApiModelProperty(value = "申诉时间")
    @NotNull(message = "缺少申诉时间")
    @Pattern(regexp = "((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))\\s([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$", message = "申诉时间日期格式不正确")
    private String appealTime;

    /**
     * 申诉号码
     */
    @ApiModelProperty(value = "申诉号码")
    @NotBlank(message = "申诉号码不能为空")
    @Size(min = 3, max = 11, message = "申诉号码长度不正确")
    @Pattern(regexp = "^[1-9]\\d*$", message = "申诉号码不能为非数字")
    private String appealNumber;

    /**
     * 申诉人
     */
    @ApiModelProperty(value = "申诉人")
    @NotBlank(message = "申诉人不能为空")
    private String appealPerson;

    /**
     * 年龄
     */
    @ApiModelProperty(value = "年龄")
    @NotNull(message = "缺少年龄信息")
    private Short appealAge = 0;

    /**
     * 性别
     */
    @ApiModelProperty(value = "性别")
    @Min(0)
    @Max(1)
    @Digits(integer = 1, fraction = 0, message = "性别取值不正确")
    private Short sex;

    /**
     * 联系电话
     */
    @ApiModelProperty(value = "联系电话")
    @NotBlank(message = "联系电话不能为空")
    @Pattern(regexp = "^1([358][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}$", message = "联系电话不正确")
    private String contactPhone;

    /**
     * 联系地址
     */
    @ApiModelProperty(value = "联系地址", allowEmptyValue = true)
    @NotNull(message = "缺少联系地址信息")
    private String contactAddress;

    /**
     * 事发时间
     */
    @ApiModelProperty(value = "事发时间")
    @NotNull(message = "缺少事发时间")
    @Pattern(regexp = "((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))\\s([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$", message = "事发时间日期格式不正确")
    private String eventDatetime;

    /**
     * 详细地址
     */
    @ApiModelProperty(value = "详细地址")
    @NotBlank(message = "详细地址不能为空")
    @Size(min = 1, max = 100, message = "详细地址长度不能超过100字符")
    private String detailAddress;

    /**
     * 记录人员编码
     */
    @ApiModelProperty(value = "记录人员编码")
    @NotBlank(message = "记录人员编码不能为空")
    @Pattern(regexp = "^[0-9]*$", message = "记录人员编码必须为数字")
    private String operCode;

    /**
     * 记录人员
     */
    @ApiModelProperty(value = "记录人员")
    @NotBlank(message = "记录人员不能为空")
    private String operName;

    /**
     * 记录人员部门编码
     */
    @ApiModelProperty(value = "记录人员部门编码")
    @NotBlank(message = "记录人员部门编码不能为空")
    @Pattern(regexp = "^[0-9]*$", message = "记录人员部门编码必须为数字")
    private String operDeptCode;

    /**
     * 记录人员部门名称
     */
    @ApiModelProperty(value = "记录人员部门名称")
    @NotBlank(message = "记录人员部门名称不能为空")
    private String operDeptName;

    /**
     * 省编码
     */
    @ApiModelProperty(value = "省编码", hidden = true)
    private String provinceCode;

    /**
     * 省名称
     */
    @ApiModelProperty(value = "省名称", hidden = true)
    private String province;

    /**
     * 城市编码
     */
    @ApiModelProperty(value = "城市编码")
    @NotBlank(message = "城市编码不能为空")
    private String cityCode;

    /**
     * 城市
     */
    @ApiModelProperty(value = "城市")
    @NotBlank(message = "城市不能为空")
    private String city;

    /**
     * 地区编码
     */
    @ApiModelProperty(value = "地区编码")
    @NotBlank(message = "地区编码不能为空")
    private String areaCode;

    /**
     * 地区
     */
    @ApiModelProperty(value = "地区")
    @NotBlank(message = "地区不能为空")
    private String area;

    /**
     * 街道编码
     */
    @ApiModelProperty(value = "街道编码")
    @NotNull(message = "缺少街道编码信息")
    private String streetCode;

    /**
     * 街道
     */
    @ApiModelProperty(value = "街道")
    @NotNull(message = "缺少街道信息")
    private String street;

    /**
     * 街道编码
     */
    @ApiModelProperty(value = "村(社区)编码")
    @NotNull(message = "缺少村(社区)编码信息")
    private String countryCode;

    /**
     * 街道
     */
    @ApiModelProperty(value = "村(社区)")
    @NotNull(message = "缺少村(社区)信息")
    private String country;

    /**
     * 事件类别0编码
     */
    @ApiModelProperty(value = "来电类型编码")
    @NotBlank(message = "来电类型编码不能为空")
    private String telTypeCode;

    /**
     * 事件类别0
     */
    @ApiModelProperty(value = "来电类型")
    @NotBlank(message = "来电类型不能为空")
    private String telType;

    /**
     * 事件类别1编码
     */
    @ApiModelProperty(value = "事件大类编码")
    @NotBlank(message = "事件大类编码不能为空")
    private String eventCategoryMainCode;

    /**
     * 事件类别1
     */
    @ApiModelProperty(value = "事件大类")
    @NotBlank(message = "事件大类不能为空")
    private String eventCategoryMain;

    /**
     * 事件类别2编码
     */
    @ApiModelProperty(value = "事件小类编码")
    @NotBlank(message = "事件小类编码不能为空")
    private String eventCategorySubCode;

    /**
     * 事件类别2
     */
    @ApiModelProperty(value = "事件小类")
    @NotBlank(message = "事件小类不能为空")
    private String eventCategorySub;

    /**
     * 事件类型编码
     */
    @ApiModelProperty(value = "事件类型编码")
    @NotBlank(message = "事件类型编码不能为空")
    private String eventTypeCode;

    /**
     * 事件类型
     */
    @ApiModelProperty(value = "事件类型")
    @NotBlank(message = "事件类型不能为空")
    private String eventType;

    /**
     * 事件来源编码
     */
    @ApiModelProperty(value = "事件来源编码")
    @NotBlank(message = "事件来源编码不能为空")
    private String eventSourceCode;

    /**
     * 事件来源
     */
    @ApiModelProperty(value = "事件来源")
    @NotBlank(message = "事件来源不能为空")
    private String eventSource;

    /**
     * 事件状态编码
     */
    @ApiModelProperty(hidden = true)
    private String eventStatusCode;

    /**
     * 事件状态
     */
    @ApiModelProperty(hidden = true)
    private String eventStatus;

    /**
     * 派单方式编码
     */
    @ApiModelProperty(value = "派单方式编码")
    @NotBlank(message = "派单方式编码不能为空")
    private String dispatchWayCode;

    /**
     * 派单方式
     */
    @ApiModelProperty(value = "派单方式")
    @NotBlank(message = "派单方式不能为空")
    private String dispatchWay;

    /**
     * 紧急程度编码
     */
    @ApiModelProperty(value = "紧急程度编码")
    @NotBlank(message = "紧急程度编码不能为空")
    private String urgencyLevelCode;

    /**
     * 紧急程度
     */
    @ApiModelProperty(value = "紧急程度")
    @NotBlank(message = "紧急程度不能为空")
    private String urgencyLevel;

    /**
     * 经度
     */
    @ApiModelProperty(value = "经度")
    @Min(value = 0, message = "最小为0")
    private BigDecimal longitude;

    /**
     * 纬度
     */
    @ApiModelProperty(value = "纬度")
    @Min(value = 0, message = "最小为0")
    private BigDecimal latitude;

    /**
     * 录音文件
     */
    @ApiModelProperty(value = "录音文件")
    @NotBlank(message = "录音文件不能为空")
    private String recordFile;
    /**
     * 是否派单
     * 0: 否   1： 是
     */
    @ApiModelProperty(hidden = true)
    private Short isDispatch = 0;

    /**
     * 是否接单
     */
    @ApiModelProperty(hidden = true)
    private Short isAccept = 0;

    /**
     * 是否催办
     */
    @ApiModelProperty(hidden = true)
    private Short isUrge = 0;

    /**
     * 是否督办
     */
    @ApiModelProperty(hidden = true)
    private Short isSupervise = 0;

    /**
     * 是否延期
     */
    @ApiModelProperty(hidden = true)
    private Short isDelay = 0;

    /**
     * 是否反馈
     */
    @ApiModelProperty(hidden = true)
    private Short isFeedback = 0;

    /**
     * 是否办结
     */
    @ApiModelProperty(hidden = true)
    private Short isFinish = 0;

    /**
     * 是否超期
     */
    @ApiModelProperty(hidden = true)
    private Short isEpire = 0;

    /**
     * 是否回访
     */
    @ApiModelProperty(hidden = true)
    private Short isVisit = 0;

    /**
     * 是否归档
     */
    @ApiModelProperty(hidden = true)
    private Short isPigeonhole = 0;

    /**
     * 是否疑难
     */
    @ApiModelProperty(value = "是否疑难(0:否 1:是)", allowableValues = "0,1")
    @Digits(integer = 1, fraction = 0, message = "是否疑难取值不正确")
    private Short isDifficult = 0;

    /**
     * 是否匿名
     */
    @ApiModelProperty(value = "是否匿名(0:否 1:是)", allowableValues = "0,1")
    @Digits(integer = 1, fraction = 0, message = "是否匿名取值不正确")
    private Short isAnonymity = 0;

    /**
     * 事件热词
     */
    @ApiModelProperty(value = "事件热词")
    @NotBlank(message = "事件热词不能为空")
    private String keyword;


    /**
     * 录音文件ID
     */
    @ApiModelProperty(value = "录音文件ID")
    @NotBlank(message = "录音文件ID不能为空")
    private String callId;


    /**
     * 事件描述
     */
    @ApiModelProperty(value = "事件描述")
    @NotBlank(message = "事件描述不能为空")
    @Size(max = 4000, message = "事件描述不能超过4000字符")
    private String description;


    @ApiModelProperty(value = "录音文件列表")
    @NotNull(message = "录音文件列表不能为空")
    @Valid
    private List<TapeRequest> tapeRequestList;
}
